package com.itbaizhan.controller;

import com.itbaizhan.domain.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.List;

//spring容器注解
@Controller
public class MyController1 {
    //该控制器的访问路径为/c1/hello1
    @RequestMapping("/c1/hello1")
    public void helloMVC(){
        System.out.println("hello SpringMVC");
    }
    /*用maven下的tomcat7启动，在浏览器上访问http://localhost:8080/c1/hello1,会报404错误，
    因为没有编写jsp页面，但在控制台输出hello SpringMVC，证明访问成功*/

    //springMVC参数获取  不论写多小个方法获取参数，路径不可以相同
    //作用：将数据自动封装
    //前端页面的表单中的name属性就是这里的参数
    // 获取简单类型参数
    //http://localhost:8080/c1/param1?a=bbz&b=10
    @RequestMapping("/c1/param1")
    public void singleParam(String a,int b){
        System.out.println(a);
        System.out.println(b);
    }
    //获取单个对象类型参数 以student为例
    //访问该方法时，请求参数名和方法参数的属性名相同，即可完成自动封装。
    //
    //http://localhost:8080/c1/param2?id=1&name=bz&age=22
    @RequestMapping("/c1/param2")
    public void objParam(Student student){
        System.out.println(student);
    }

    //封装关联对象  对象中含有另一个对象  student 中含有address对象
   /*访问该方法时，请求参数名和方法参数的属性名相同，即可完成自动封装。

http://localhost:8080/c1/param3?id=1&name=bz&age=22&address.info=beijing&address.postcode=030000*/
    @RequestMapping("/c1/param3")
    public void objParam2(Student student){
        System.out.println(student);
    }

    /*封装为简单数据类型的list参数
    * 在参数中加@RequestParam*/
    //请求的参数写法  注意：users= &users=
    //http://localhost:8080/c1/param4?users=bj&users=sxt
    @RequestMapping("/c1/param4")
    public void listParam(@RequestParam List<String> users){
        System.out.println(users);
    }
    //请求的参数写法
    // http://localhost:8080/c1/param5?users=bj&users=sxt
    @RequestMapping("/c1/param5")
    public void listParam2(@RequestParam String[] users){
        System.out.println(users[0]);
        System.out.println(users[1]);
    }

    /*封装对象类型集合
    * SpringMVC不支持将参数封装为对象类型的List集合，
    * 但可以封装到有List属性的对象中 */

    //不可以这样写，SpringMVC不支持将参数封装为对象类型的List集合
   /* @RequestMapping("/c1/param6")
    public void listParam3(@RequestParam List<Student> students){
        System.out.println(students);
    }*/
    //可以封装到有List属性的对象中
    // 将Address 的集合属性编写在Student中
    /*请求的参数写法

http://localhost:8080/c1/param6?
id=1&name=bz&sex=female&address[0].info=bj&address[0].postcode=100010
&address[1].info=sh&address[1].postcode=100011*/
    @RequestMapping("/c1/param6")
    public void listParam3(Student students){
        System.out.println(students);
    }

//springMVC要封装Map集合，需要封装到有Map属性的对象中。
/*
* 请求的参数写法
  注意键值对的写法   key用one表示
http://localhost:8080/c1/param7?id=1&name=bz&sex=female&
* address[‘one’].info=bj&address[‘one’].postcode=100010
* &address[‘two’].info=sh&address[‘two’].postcode=100011*/
    @RequestMapping("/c1/param7")
    public void mapParam(Student students){
        System.out.println(students);
}


//使用Servlet原生对象 在方法参数中定义HttpServletRequest、HttpServletResponse、HttpSession
// 等类型的参数即可直接在方法中使用。
//一般情况下，在SpringMVC中都有对Servlet原生对象的方法的替代，
// 推荐使用SpringMVC的方式代替Servlet原生对象。
//http://localhost:8080/c1/param8?name=bjsxt
    @RequestMapping("/c1/param8")
    public void servletParam(HttpServletRequest request, HttpServletResponse response, HttpSession session){
        System.out.println(request.getParameter("name"));
        System.out.println(response.getCharacterEncoding());
        System.out.println(session.getId());
    }


    /*前端传来的参数全部为字符串类型，SpringMVC使用自带的转换器将字符串参数转为需要的类型
    *但在某些情况下，无法将字符串转为需要的类型
    * 日期数据有很多种格式，SpringMVC没办法把所有格式的字符串转换
    * 成日期类型。比如参数格式为birthday=2025-01-01时，
    * SpringMVC就无法解析参数。此时需要自定义参数类型转换器。

    1,定义类型转换器类，实现Converter接口
    * 2,注册类型转换器对象
    * 此时再访问http://localhost:8080/c1/param9?birthday=2025-01-01时，
    * SpringMVC即可将请求参数封装为Date类型的参数。*/
    //  日期的字符串转为date格式
    @RequestMapping("/c1/param9")
    public void dataParam(Date birthday){
        System.out.println(birthday);
    }

    //处理中文post请求乱码
    /*在传递参数时，tomcat8以上能处理get请求的中文乱码，但不能处理post请求的中文乱码
在maven中的tomcat7,不断更新，所以也与tomcat8一样
SpringMVC提供了处理中文乱码的过滤器，在web.xml中配置该过滤器*/
    @RequestMapping("c1/code")
    public void codeParam(String name){
        System.out.println(name);
    }

}
/*接下来我们编写一个SpringMVC的入门案例
1，使用maven创建web项目，补齐包结构。
2，在pom.xml引入相关依赖和tomcat插件
3,在web.xml中配置前端控制器DispatcherServlet
4,编写SpringMVC核心配置文件springmvc.xml，
该文件和Spring配置文件写法一样。
5,编写控制器*/

/*在Servlet中我们通过request.getParameter(name)获取请求参数。该方式存在两个问题：

请求参数较多时会出现代码冗余。
与容器紧耦合。
而SpringMVC支持参数注入的方式用于获取请求数据，即将请求参数直接封装到方法的参数当中
访问该方法时，请求参数名和方法参数名相同，即可完成自动封装。

http://localhost:8080/c1/param1?username=bz&age=10*/

